<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>Test Report</title>
    <link href="assets/style.css" rel="stylesheet" type="text/css"/></head>
  <body onLoad="init()">
    <script>/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */


function toArray(iter) {
    if (iter === null) {
        return null;
    }
    return Array.prototype.slice.call(iter);
}

function find(selector, elem) {
    if (!elem) {
        elem = document;
    }
    return elem.querySelector(selector);
}

function find_all(selector, elem) {
    if (!elem) {
        elem = document;
    }
    return toArray(elem.querySelectorAll(selector));
}

function sort_column(elem) {
    toggle_sort_states(elem);
    var colIndex = toArray(elem.parentNode.childNodes).indexOf(elem);
    var key;
    if (elem.classList.contains('numeric')) {
        key = key_num;
    } else if (elem.classList.contains('result')) {
        key = key_result;
    } else {
        key = key_alpha;
    }
    sort_table(elem, key(colIndex));
}

function show_all_extras() {
    find_all('.col-result').forEach(show_extras);
}

function hide_all_extras() {
    find_all('.col-result').forEach(hide_extras);
}

function show_extras(colresult_elem) {
    var extras = colresult_elem.parentNode.nextElementSibling;
    var expandcollapse = colresult_elem.firstElementChild;
    extras.classList.remove("collapsed");
    expandcollapse.classList.remove("expander");
    expandcollapse.classList.add("collapser");
}

function hide_extras(colresult_elem) {
    var extras = colresult_elem.parentNode.nextElementSibling;
    var expandcollapse = colresult_elem.firstElementChild;
    extras.classList.add("collapsed");
    expandcollapse.classList.remove("collapser");
    expandcollapse.classList.add("expander");
}

function show_filters() {
    var filter_items = document.getElementsByClassName('filter');
    for (var i = 0; i < filter_items.length; i++)
        filter_items[i].hidden = false;
}

function add_collapse() {
    // Add links for show/hide all
    var resulttable = find('table#results-table');
    var showhideall = document.createElement("p");
    showhideall.innerHTML = '<a href="javascript:show_all_extras()">Show all details</a> / ' +
                            '<a href="javascript:hide_all_extras()">Hide all details</a>';
    resulttable.parentElement.insertBefore(showhideall, resulttable);

    // Add show/hide link to each result
    find_all('.col-result').forEach(function(elem) {
        var collapsed = get_query_parameter('collapsed') || 'Passed';
        var extras = elem.parentNode.nextElementSibling;
        var expandcollapse = document.createElement("span");
        if (collapsed.includes(elem.innerHTML)) {
            extras.classList.add("collapsed");
            expandcollapse.classList.add("expander");
        } else {
            expandcollapse.classList.add("collapser");
        }
        elem.appendChild(expandcollapse);

        elem.addEventListener("click", function(event) {
            if (event.currentTarget.parentNode.nextElementSibling.classList.contains("collapsed")) {
                show_extras(event.currentTarget);
            } else {
                hide_extras(event.currentTarget);
            }
        });
    })
}

function get_query_parameter(name) {
    var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
    return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}

function init () {
    reset_sort_headers();

    add_collapse();

    show_filters();

    toggle_sort_states(find('.initial-sort'));

    find_all('.sortable').forEach(function(elem) {
        elem.addEventListener("click",
                              function(event) {
                                  sort_column(elem);
                              }, false)
    });

};

function sort_table(clicked, key_func) {
    var rows = find_all('.results-table-row');
    var reversed = !clicked.classList.contains('asc');
    var sorted_rows = sort(rows, key_func, reversed);
    /* Whole table is removed here because browsers acts much slower
     * when appending existing elements.
     */
    var thead = document.getElementById("results-table-head");
    document.getElementById('results-table').remove();
    var parent = document.createElement("table");
    parent.id = "results-table";
    parent.appendChild(thead);
    sorted_rows.forEach(function(elem) {
        parent.appendChild(elem);
    });
    document.getElementsByTagName("BODY")[0].appendChild(parent);
}

function sort(items, key_func, reversed) {
    var sort_array = items.map(function(item, i) {
        return [key_func(item), i];
    });
    var multiplier = reversed ? -1 : 1;

    sort_array.sort(function(a, b) {
        var key_a = a[0];
        var key_b = b[0];
        return multiplier * (key_a >= key_b ? 1 : -1);
    });

    return sort_array.map(function(item) {
        var index = item[1];
        return items[index];
    });
}

function key_alpha(col_index) {
    return function(elem) {
        return elem.childNodes[1].childNodes[col_index].firstChild.data.toLowerCase();
    };
}

function key_num(col_index) {
    return function(elem) {
        return parseFloat(elem.childNodes[1].childNodes[col_index].firstChild.data);
    };
}

function key_result(col_index) {
    return function(elem) {
        var strings = ['Error', 'Failed', 'Rerun', 'XFailed', 'XPassed',
                       'Skipped', 'Passed'];
        return strings.indexOf(elem.childNodes[1].childNodes[col_index].firstChild.data);
    };
}

function reset_sort_headers() {
    find_all('.sort-icon').forEach(function(elem) {
        elem.parentNode.removeChild(elem);
    });
    find_all('.sortable').forEach(function(elem) {
        var icon = document.createElement("div");
        icon.className = "sort-icon";
        icon.textContent = "vvv";
        elem.insertBefore(icon, elem.firstChild);
        elem.classList.remove("desc", "active");
        elem.classList.add("asc", "inactive");
    });
}

function toggle_sort_states(elem) {
    //if active, toggle between asc and desc
    if (elem.classList.contains('active')) {
        elem.classList.toggle('asc');
        elem.classList.toggle('desc');
    }

    //if inactive, reset all other functions and add ascending active
    if (elem.classList.contains('inactive')) {
        reset_sort_headers();
        elem.classList.remove('inactive');
        elem.classList.add('active');
    }
}

function is_all_rows_hidden(value) {
  return value.hidden == false;
}

function filter_table(elem) {
    var outcome_att = "data-test-result";
    var outcome = elem.getAttribute(outcome_att);
    class_outcome = outcome + " results-table-row";
    var outcome_rows = document.getElementsByClassName(class_outcome);

    for(var i = 0; i < outcome_rows.length; i++){
        outcome_rows[i].hidden = !elem.checked;
    }

    var rows = find_all('.results-table-row').filter(is_all_rows_hidden);
    var all_rows_hidden = rows.length == 0 ? true : false;
    var not_found_message = document.getElementById("not-found-message");
    not_found_message.hidden = !all_rows_hidden;
}
</script>
    <h1>2020-08-07_21_26_18_report.html</h1>
    <p>Report generated on 07-Aug-2020 at 21:27:02 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v1.20.0</p>
    <h2>Environment</h2>
    <table id="environment">
      <tr>
        <td>Packages</td>
        <td>{&apos;pytest&apos;: &apos;3.6.0&apos;, &apos;py&apos;: &apos;1.7.0&apos;, &apos;pluggy&apos;: &apos;0.6.0&apos;}</td></tr>
      <tr>
        <td>Platform</td>
        <td>Darwin-18.6.0-x86_64-i386-64bit</td></tr>
      <tr>
        <td>Plugins</td>
        <td>{&apos;rerunfailures&apos;: &apos;5.0&apos;, &apos;metadata&apos;: &apos;1.8.0&apos;, &apos;html&apos;: &apos;1.20.0&apos;, &apos;forked&apos;: &apos;1.0.2&apos;, &apos;allure-adaptor&apos;: &apos;1.7.10&apos;}</td></tr>
      <tr>
        <td>Python</td>
        <td>3.7.4</td></tr></table>
    <h2>Summary</h2>
    <p>4 tests ran in 43.88 seconds. </p>
    <p class="filter" hidden="true">(Un)check the boxes to filter the results.</p><input checked="true" class="filter" data-test-result="passed" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="passed">2 passed</span>, <input checked="true" class="filter" data-test-result="skipped" disabled="true" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="skipped">0 skipped</span>, <input checked="true" class="filter" data-test-result="failed" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="failed">2 failed</span>, <input checked="true" class="filter" data-test-result="error" disabled="true" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="error">0 errors</span>, <input checked="true" class="filter" data-test-result="xfailed" disabled="true" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="xfailed">0 expected failures</span>, <input checked="true" class="filter" data-test-result="xpassed" disabled="true" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="xpassed">0 unexpected passes</span>, <input checked="true" class="filter" data-test-result="rerun" disabled="true" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="rerun">0 rerun</span>
    <h2>Results</h2>
    <table id="results-table">
      <thead id="results-table-head">
        <tr>
          <th class="sortable result initial-sort" col="result">Result</th>
          <th class="sortable" col="name">Test</th>
          <th class="sortable numeric" col="duration">Duration</th>
          <th>Links</th></tr>
        <tr hidden="true" id="not-found-message">
          <th colspan="4">No results found. Try to check the filters</th></tr></thead>
      <tbody class="failed results-table-row">
        <tr>
          <td class="col-result">Failed</td>
          <td class="col-name">test_case/test_case.py::Test::test__2</td>
          <td class="col-duration">6.03</td>
          <td class="col-links"></td></tr>
        <tr>
          <td class="extra" colspan="4">
            <div class="log">self = &lt;test_case.Test testMethod=test__2&gt;, descrption = &#x27;新增钉钉机器人&#x27;<br/>url = &#x27;http://localhost:8096/Dingding/&#x27;, method = &#x27;POST&#x27;, headers = &#x27;&#x27;<br/>cookies = &#x27;&#x27;, params = &#x27;&#x27;<br/>body = {&#x27;desc&#x27;: &#x27;测试新增机器人&#x27;, &#x27;keysWord&#x27;: &#x27;keywork&#x27;, &#x27;webhook&#x27;: &#x27;http&#x27;}, file = &#x27;&#x27;<br/>verify = &#x27;$.msg=操作成功&#x27;, saves = &#x27;&#x27;, dbtype = &#x27;&#x27;, db = &#x27;&#x27;, setup_sql = &#x27;&#x27;<br/>teardown_sql = &#x27;&#x27;<br/><br/>    @data(*api_data)<br/>    @unpack<br/>    def test_(self, descrption, url, method, headers, cookies, params, body, file, verify, saves, dbtype, db, setup_sql,<br/>              teardown_sql):<br/>        logger.info(&quot;用例描述====&gt;&quot; + descrption)<br/>        url = self.build_param(url)<br/>        headers = self.build_param(headers)<br/>        params = self.build_param(params)<br/>        body = self.build_param(body)<br/>        setup_sql = self.build_param(setup_sql)<br/>        teardown_sql = self.build_param(teardown_sql)<br/>    <br/>        params = eval(params) if params else params<br/>        headers = eval(headers) if headers else headers<br/>        cookies = eval(cookies) if cookies else cookies<br/>        body = eval(body) if body else body<br/>        file = eval(file) if file else file<br/>    <br/>        db_connect = None<br/>        redis_db_connect = None<br/>        res = None<br/>        # 判断数据库类型,暂时只有mysql,redis<br/>        if dbtype.lower() == &quot;mysql&quot;:<br/>            db_connect = MySQLOperate(db)<br/>        elif dbtype.lower() == &quot;redis&quot;:<br/>            redis_db_connect = RedisOperate(db)<br/>        else:<br/>            pass<br/>    <br/>        if db_connect:<br/>            self.execute_setup_sql(db_connect, setup_sql)<br/>        if redis_db_connect:<br/>            # 执行teardown_redis操作<br/>            self.execute_redis_get(redis_db_connect, setup_sql)<br/>    <br/>        # 判断接口请求类型<br/>        if method.upper() == &#x27;GET&#x27;:<br/>            res = self.request.get_request(url=url, params=params, headers=headers, cookies=cookies)<br/>        elif method.upper() == &#x27;POST&#x27;:<br/>            res = self.request.post_request(url=url, headers=headers, cookies=cookies, params=params, json=body)<br/>        elif method.upper() == &#x27;UPLOAD&#x27;:<br/>            res = self.request.upload_request(url=url, headers=headers, cookies=cookies, params=params, data=body,<br/>                                              files=file)<br/>        elif method.upper() == &#x27;PUT&#x27;:<br/>            res = self.request.put_request(url=url, headers=headers, cookies=cookies, params=params, data=body)<br/>        elif method.upper() == &#x27;DELETE&#x27;:<br/>            res = self.request.delete_request(url=url, headers=headers, cookies=cookies, params=params, data=body)<br/>        else:<br/>            pass  # 待扩展<br/>    <br/>        if db_connect:<br/>            # 执行teardown_sql<br/>            self.execute_teardown_sql(db_connect, teardown_sql)<br/>    <br/>        if saves:<br/>            # 遍历saves<br/>            for save in saves.split(&quot;;&quot;):<br/>                # 切割字符串 如 key=$.data<br/>                key = save.split(&quot;=&quot;)[0]<br/>                jsp = save.split(&quot;=&quot;)[1]<br/>                self.save_data(res.json(), key + &quot;-&quot; + &quot;{id}&quot;, jsp)<br/>    <br/>        if verify:<br/>            # 遍历verify:<br/>            if verify.endswith(&quot;;&quot;):<br/>                verify = verify.split(&quot;;&quot;)[0]<br/>            for ver in verify.split(&quot;;&quot;):<br/>                expr = ver.split(&quot;=&quot;)[0]<br/>                # 判断Jsonpath还是正则断言<br/>                if expr.startswith(&quot;$.&quot;):<br/>                    actual = jsonpath.jsonpath(res.json(), expr)<br/>                    if not actual:<br/>&gt;                       raise KeyError(&quot;该jsonpath未匹配到值,请确认接口响应和jsonpath正确性&quot;)<br/><span class="error">E                       KeyError: &#x27;该jsonpath未匹配到值,请确认接口响应和jsonpath正确性&#x27;</span><br/><br/>test_case/test_case.py:194: KeyError<br/>------------------------------ Captured log call -------------------------------<br/>test_case.py               126 INFO     用例描述====&gt;新增钉钉机器人
testBase.py                169 INFO     请求方式====&gt;POST
testBase.py                170 INFO     请求地址====&gt;http://localhost:8096/Dingding/
testBase.py                171 INFO     请求头====&gt;&quot;&quot;
testBase.py                172 INFO     请求参数====&gt;&quot;&quot;
testBase.py                173 INFO     请求体====&gt;{
    &quot;desc&quot;: &quot;测试新增机器人&quot;,
    &quot;keysWord&quot;: &quot;keywork&quot;,
    &quot;webhook&quot;: &quot;http&quot;
}
testBase.py                176 INFO     Cookies====&gt;&quot;&quot;
testBase.py                177 INFO     接口响应状态码====&gt;500
testBase.py                178 INFO     接口响应头为====&gt;{&#x27;Vary&#x27;: &#x27;Origin, Access-Control-Request-Method, Access-Control-Request-Headers&#x27;, &#x27;Content-Type&#x27;: &#x27;application/json&#x27;, &#x27;Transfer-Encoding&#x27;: &#x27;chunked&#x27;, &#x27;Date&#x27;: &#x27;Fri, 07 Aug 2020 13:26:41 GMT&#x27;, &#x27;Connection&#x27;: &#x27;close&#x27;}
testBase.py                179 INFO     接口响应体为====&gt;{&quot;timestamp&quot;:&quot;2020-08-07 08:26:41&quot;,&quot;status&quot;:500,&quot;error&quot;:&quot;Internal Server Error&quot;,&quot;message&quot;:&quot;暂无此权限&quot;,&quot;path&quot;:&quot;/Dingding/&quot;}</div></td></tr></tbody>
      <tbody class="failed results-table-row">
        <tr>
          <td class="col-result">Failed</td>
          <td class="col-name">test_case/test_case.py::Test::test__3</td>
          <td class="col-duration">6.02</td>
          <td class="col-links"></td></tr>
        <tr>
          <td class="extra" colspan="4">
            <div class="log">self = &lt;test_case.Test testMethod=test__3&gt;, descrption = &#x27;查询钉钉机器人&#x27;<br/>url = &#x27;http://localhost:8096/Dingding/list&#x27;, method = &#x27;GET&#x27;, headers = &#x27;&#x27;<br/>cookies = &#x27;&#x27;, params = &#x27;&#x27;, body = &#x27;&#x27;, file = &#x27;&#x27;<br/>verify = &#x27;$.msg=操作成功;$.code=200&#x27;, saves = &#x27;dingId=$.data[0].id&#x27;, dbtype = &#x27;&#x27;<br/>db = &#x27;&#x27;, setup_sql = &#x27;&#x27;, teardown_sql = &#x27;&#x27;<br/><br/>    @data(*api_data)<br/>    @unpack<br/>    def test_(self, descrption, url, method, headers, cookies, params, body, file, verify, saves, dbtype, db, setup_sql,<br/>              teardown_sql):<br/>        logger.info(&quot;用例描述====&gt;&quot; + descrption)<br/>        url = self.build_param(url)<br/>        headers = self.build_param(headers)<br/>        params = self.build_param(params)<br/>        body = self.build_param(body)<br/>        setup_sql = self.build_param(setup_sql)<br/>        teardown_sql = self.build_param(teardown_sql)<br/>    <br/>        params = eval(params) if params else params<br/>        headers = eval(headers) if headers else headers<br/>        cookies = eval(cookies) if cookies else cookies<br/>        body = eval(body) if body else body<br/>        file = eval(file) if file else file<br/>    <br/>        db_connect = None<br/>        redis_db_connect = None<br/>        res = None<br/>        # 判断数据库类型,暂时只有mysql,redis<br/>        if dbtype.lower() == &quot;mysql&quot;:<br/>            db_connect = MySQLOperate(db)<br/>        elif dbtype.lower() == &quot;redis&quot;:<br/>            redis_db_connect = RedisOperate(db)<br/>        else:<br/>            pass<br/>    <br/>        if db_connect:<br/>            self.execute_setup_sql(db_connect, setup_sql)<br/>        if redis_db_connect:<br/>            # 执行teardown_redis操作<br/>            self.execute_redis_get(redis_db_connect, setup_sql)<br/>    <br/>        # 判断接口请求类型<br/>        if method.upper() == &#x27;GET&#x27;:<br/>            res = self.request.get_request(url=url, params=params, headers=headers, cookies=cookies)<br/>        elif method.upper() == &#x27;POST&#x27;:<br/>            res = self.request.post_request(url=url, headers=headers, cookies=cookies, params=params, json=body)<br/>        elif method.upper() == &#x27;UPLOAD&#x27;:<br/>            res = self.request.upload_request(url=url, headers=headers, cookies=cookies, params=params, data=body,<br/>                                              files=file)<br/>        elif method.upper() == &#x27;PUT&#x27;:<br/>            res = self.request.put_request(url=url, headers=headers, cookies=cookies, params=params, data=body)<br/>        elif method.upper() == &#x27;DELETE&#x27;:<br/>            res = self.request.delete_request(url=url, headers=headers, cookies=cookies, params=params, data=body)<br/>        else:<br/>            pass  # 待扩展<br/>    <br/>        if db_connect:<br/>            # 执行teardown_sql<br/>            self.execute_teardown_sql(db_connect, teardown_sql)<br/>    <br/>        if saves:<br/>            # 遍历saves<br/>            for save in saves.split(&quot;;&quot;):<br/>                # 切割字符串 如 key=$.data<br/>                key = save.split(&quot;=&quot;)[0]<br/>                jsp = save.split(&quot;=&quot;)[1]<br/>                self.save_data(res.json(), key + &quot;-&quot; + &quot;{id}&quot;, jsp)<br/>    <br/>        if verify:<br/>            # 遍历verify:<br/>            if verify.endswith(&quot;;&quot;):<br/>                verify = verify.split(&quot;;&quot;)[0]<br/>            for ver in verify.split(&quot;;&quot;):<br/>                expr = ver.split(&quot;=&quot;)[0]<br/>                # 判断Jsonpath还是正则断言<br/>                if expr.startswith(&quot;$.&quot;):<br/>                    actual = jsonpath.jsonpath(res.json(), expr)<br/>                    if not actual:<br/>&gt;                       raise KeyError(&quot;该jsonpath未匹配到值,请确认接口响应和jsonpath正确性&quot;)<br/><span class="error">E                       KeyError: &#x27;该jsonpath未匹配到值,请确认接口响应和jsonpath正确性&#x27;</span><br/><br/>test_case/test_case.py:194: KeyError<br/>------------------------------ Captured log call -------------------------------<br/>test_case.py               126 INFO     用例描述====&gt;查询钉钉机器人
testBase.py                169 INFO     请求方式====&gt;GET
testBase.py                170 INFO     请求地址====&gt;http://localhost:8096/Dingding/list
testBase.py                171 INFO     请求头====&gt;&quot;&quot;
testBase.py                172 INFO     请求参数====&gt;&quot;&quot;
testBase.py                173 INFO     请求体====&gt;null
testBase.py                176 INFO     Cookies====&gt;&quot;&quot;
testBase.py                177 INFO     接口响应状态码====&gt;500
testBase.py                178 INFO     接口响应头为====&gt;{&#x27;Vary&#x27;: &#x27;Origin, Access-Control-Request-Method, Access-Control-Request-Headers&#x27;, &#x27;Content-Type&#x27;: &#x27;application/json&#x27;, &#x27;Transfer-Encoding&#x27;: &#x27;chunked&#x27;, &#x27;Date&#x27;: &#x27;Fri, 07 Aug 2020 13:26:47 GMT&#x27;, &#x27;Connection&#x27;: &#x27;close&#x27;}
testBase.py                179 INFO     接口响应体为====&gt;{&quot;timestamp&quot;:&quot;2020-08-07 08:26:47&quot;,&quot;status&quot;:500,&quot;error&quot;:&quot;Internal Server Error&quot;,&quot;message&quot;:&quot;暂无此权限&quot;,&quot;path&quot;:&quot;/Dingding/list&quot;}
test_case.py                43 ERROR</div></td></tr></tbody>
      <tbody class="passed results-table-row">
        <tr>
          <td class="col-result">Passed</td>
          <td class="col-name">test_case/test_case.py::Test::test__1</td>
          <td class="col-duration">16.28</td>
          <td class="col-links"></td></tr>
        <tr>
          <td class="extra" colspan="4">
            <div class="log">------------------------------ Captured log call -------------------------------<br/>test_case.py               126 INFO     用例描述====&gt;登入
testBase.py                169 INFO     请求方式====&gt;POST
testBase.py                170 INFO     请求地址====&gt;http://localhost:8096/login
testBase.py                171 INFO     请求头====&gt;&quot;&quot;
testBase.py                172 INFO     请求参数====&gt;&quot;&quot;
testBase.py                173 INFO     请求体====&gt;{
    &quot;password&quot;: &quot;123456&quot;,
    &quot;userName&quot;: &quot;admin&quot;
}
testBase.py                176 INFO     Cookies====&gt;&quot;&quot;
testBase.py                177 INFO     接口响应状态码====&gt;200
testBase.py                178 INFO     接口响应头为====&gt;{&#x27;Vary&#x27;: &#x27;Origin, Access-Control-Request-Method, Access-Control-Request-Headers&#x27;, &#x27;Set-Cookie&#x27;: &#x27;JSESSIONID=B2D61CA3356EAE8D1917050965697986; Path=/; HttpOnly, rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Thu, 06-Aug-2020 13:26:29 GMT&#x27;, &#x27;Content-Type&#x27;: &#x27;application/json&#x27;, &#x27;Transfer-Encoding&#x27;: &#x27;chunked&#x27;, &#x27;Date&#x27;: &#x27;Fri, 07 Aug 2020 13:26:35 GMT&#x27;}
testBase.py                179 INFO     接口响应体为====&gt;{&quot;msg&quot;:&quot;登入成功&quot;,&quot;code&quot;:200,&quot;data&quot;:{&quot;userName&quot;:&quot;admin&quot;,&quot;userId&quot;:&quot;ec218f1c-bfba-4d58-a1f1-4883c0dec873&quot;},&quot;success&quot;:true}
testBase.py                135 INFO     断言成功,实际值：登入成功 等于 预期值：登入成功
testBase.py                135 INFO     断言成功,实际值：200 等于 预期值：200</div></td></tr></tbody>
      <tbody class="passed results-table-row">
        <tr>
          <td class="col-result">Passed</td>
          <td class="col-name">test_case/test_case.py::Test::test__4</td>
          <td class="col-duration">15.03</td>
          <td class="col-links"></td></tr>
        <tr>
          <td class="extra" colspan="4">
            <div class="log">------------------------------ Captured log call -------------------------------<br/>test_case.py               126 INFO     用例描述====&gt;删除钉钉机器人
test_case.py                79 INFO     执行前置sql====&gt;select * from dingding limit 1，获得以下结果集:{&#x27;id&#x27;: 3, &#x27;desc_id&#x27;: &#x27;5f39009f-9f03-4b03-a2ba-cb9a542c121f&#x27;, &#x27;desc&#x27;: &#x27;test-desc12312312&#x27;, &#x27;keysword&#x27;: &#x27;teemo&#x27;, &#x27;webhook&#x27;: &#x27;https://oapi.dingtalk.com/robot/send?access_token=9a26f57b418834f320ed8cc5036dd8e15ba5e8f9a2985cee87ad8bc45bd2ff9d&#x27;, &#x27;creater&#x27;: &#x27;admin&#x27;}
test_case.py                83 INFO     保存 id=&gt;3 到全局变量池
test_case.py                83 INFO     保存 desc_id=&gt;5f39009f-9f03-4b03-a2ba-cb9a542c121f 到全局变量池
test_case.py                83 INFO     保存 desc=&gt;test-desc12312312 到全局变量池
test_case.py                83 INFO     保存 keysword=&gt;teemo 到全局变量池
test_case.py                83 INFO     保存 webhook=&gt;https://oapi.dingtalk.com/robot/send?access_token=9a26f57b418834f320ed8cc5036dd8e15ba5e8f9a2985cee87ad8bc45bd2ff9d 到全局变量池
test_case.py                83 INFO     保存 creater=&gt;admin 到全局变量池
test_case.py                79 INFO     执行前置sql====&gt;select * from db limit 1，获得以下结果集:{&#x27;id&#x27;: 11, &#x27;db_id&#x27;: &#x27;84ceb20c-3970-4982-9c65-1e9d001a330c&#x27;, &#x27;db_name&#x27;: &#x27;temo&#x27;, &#x27;db_type&#x27;: &#x27;100&#x27;, &#x27;host&#x27;: &#x27;1&#x27;, &#x27;port&#x27;: 1, &#x27;user&#x27;: &#x27;1&#x27;, &#x27;pwd&#x27;: &#x27;1&#x27;, &#x27;db_library_name&#x27;: &#x27;temo-server&#x27;, &#x27;createtime&#x27;: datetime.datetime(2019, 10, 23, 17, 3, 23), &#x27;updatetime&#x27;: datetime.datetime(2020, 4, 30, 2, 31, 43)}
test_case.py                83 INFO     保存 id=&gt;11 到全局变量池
test_case.py                83 INFO     保存 db_id=&gt;84ceb20c-3970-4982-9c65-1e9d001a330c 到全局变量池
test_case.py                83 INFO     保存 db_name=&gt;temo 到全局变量池
test_case.py                83 INFO     保存 db_type=&gt;100 到全局变量池
test_case.py                83 INFO     保存 host=&gt;1 到全局变量池
test_case.py                83 INFO     保存 port=&gt;1 到全局变量池
test_case.py                83 INFO     保存 user=&gt;1 到全局变量池
test_case.py                83 INFO     保存 pwd=&gt;1 到全局变量池
test_case.py                83 INFO     保存 db_library_name=&gt;temo-server 到全局变量池
test_case.py                83 INFO     保存 createtime=&gt;2019-10-23 17:03:23 到全局变量池
test_case.py                83 INFO     保存 updatetime=&gt;2020-04-30 02:31:43 到全局变量池
testBase.py                169 INFO     请求方式====&gt;DELETE
testBase.py                170 INFO     请求地址====&gt;http://localhost:8096/Dingding/None
testBase.py                171 INFO     请求头====&gt;&quot;&quot;
testBase.py                172 INFO     请求参数====&gt;&quot;&quot;
testBase.py                173 INFO     请求体====&gt;null
testBase.py                176 INFO     Cookies====&gt;&quot;&quot;
testBase.py                177 INFO     接口响应状态码====&gt;200
testBase.py                178 INFO     接口响应头为====&gt;{&#x27;Vary&#x27;: &#x27;Origin, Access-Control-Request-Method, Access-Control-Request-Headers&#x27;, &#x27;Content-Type&#x27;: &#x27;application/json&#x27;, &#x27;Transfer-Encoding&#x27;: &#x27;chunked&#x27;, &#x27;Date&#x27;: &#x27;Fri, 07 Aug 2020 13:27:02 GMT&#x27;}
testBase.py                179 INFO     接口响应体为====&gt;{&quot;msg&quot;:&quot;操作成功&quot;,&quot;code&quot;:200,&quot;data&quot;:null,&quot;success&quot;:true}
testBase.py                135 INFO     断言成功,实际值：操作成功 等于 预期值：操作成功
testBase.py                135 INFO     断言成功,实际值：200 等于 预期值：200</div></td></tr></tbody></table></body></html>